/**
 * 隧道工程安全岩盘厚度计算算法类
 * 
 * 该类提供了隧道工程中顶部、底部和侧部安全岩盘厚度的计算方法，
 * 基于岩体力学原理和工程安全系数要求，确保隧道施工和运营安全。
 */
export class StratumAlgorithms {
  /**
   * 顶部安全岩盘厚度计算
   * 
   * 基于岩体抗拉和抗剪强度，计算隧道顶部所需的最小安全岩盘厚度，
   * 确保在岩体自重和溶洞填充物压力作用下的稳定性。
   * 
   * @param gamma_m 岩体容重 (kN/m³)
   * @param l 跨度 (m)
   * @param sigma_t 岩体抗拉强度 (kPa)
   * @param tau 岩体抗剪强度 (kPa)
   * @param q 溶洞填充物压力 (kPa)
   * @param k_s 安全系数
   * @returns 安全岩盘厚度 (m)
   */
  static thicknessRockStratumTop(gamma_m: number, l: number, sigma_t: number, tau: number, q: number, k_s: number): { Ts: number } {
      // 顶部公式1：基于抗拉强度计算
    const ts_top1 = k_s * (gamma_m * Math.pow(l, 2) + Math.sqrt(Math.pow(gamma_m, 2) * Math.pow(l, 4) + 2 * sigma_t * q * Math.pow(l, 2))) / sigma_t;
      // 顶部公式2：基于抗剪强度计算
    const ts_top2 = k_s * (gamma_m * l + Math.sqrt(Math.pow(gamma_m, 2) * Math.pow(l, 2) + 2 * tau * q * l)) / tau;
    return { Ts: Math.max(ts_top1, ts_top2) };
  }

  /**
   * 底部安全岩盘厚度计算
   * 
   * 基于岩体抗拉和抗剪强度，计算隧道底部所需的最小安全岩盘厚度，
   * 确保在地下水和上覆荷载作用下的稳定性。
   * 
   * @param gamma_m 岩体容重 (kN/m³)
   * @param l 跨度 (m)
   * @param sigma_t 岩体抗拉强度 (kPa)
   * @param tau 岩体抗剪强度 (kPa)
   * @param q 溶洞填充物压力 (kPa)
   * @param k_s 安全系数
   * @returns 安全岩盘厚度 (m)
   */
  static thicknessRockStratumBottom(gamma_m: number, l: number, sigma_t: number, tau: number, q: number, k_s: number): { Ts: number } {
      // 底部公式1：基于抗拉强度计算
    const ts_bottom1 = k_s * (-gamma_m * Math.pow(l, 2) + Math.sqrt(Math.pow(gamma_m, 2) * Math.pow(l, 4) + 8 * sigma_t * q * Math.pow(l, 2))) / (4 * sigma_t);
      // 底部公式2：基于抗剪强度计算
    const ts_bottom2 = k_s * (-gamma_m * l + Math.sqrt(Math.pow(gamma_m, 2) * Math.pow(l, 2) + 2 * tau * q * l)) / tau;
    return { Ts: Math.max(ts_bottom1, ts_bottom2) };
  }

  /**
   * 侧部安全岩盘厚度计算
   * 
   * 基于岩体抗拉和抗剪强度，计算隧道侧部所需的最小安全岩盘厚度，
   * 考虑回填土压力和地下水作用的影响。
   * 
   * @param k_s 安全系数
   * @param l 跨度 (m)
   * @param sigma_t 岩体抗拉强度 (kPa)
   * @param tau 岩体抗剪强度 (kPa)
   * @param k_af 回填土修正系数
   * @param gamma_f 回填土容重 (kN/m³)
   * @param h 回填土高度 (m)
   * @param p 压力 (kPa)
   * @param gamma_w 水容重 (kN/m³)
   * @returns 安全岩盘厚度 (m)
   */
  static thicknessRockStratumSide(k_s: number, l: number, sigma_t: number, tau: number, k_af: number, gamma_f: number, h: number, p: number, gamma_w: number): { Ts: number } {
      // 侧部公式1：基于抗拉强度计算
    const ts_side1 = k_s * Math.sqrt(((k_af * gamma_f * h + p) * Math.pow(l, 2) + 6 * (k_af * gamma_f + gamma_w) * Math.pow(l, 3)) / (20 * sigma_t));
      // 侧部公式2：基于抗剪强度计算
    const ts_side2 = k_s * Math.sqrt((10 * (k_af * gamma_f * h + p) * l + 7 * (k_af * gamma_f + gamma_w) * Math.pow(l, 2)) / (5 * tau));
    return { Ts: Math.max(ts_side1, ts_side2) };
  }
}